//协议

//二进制数据编码
var bin_encode = {
    //0 是服务号
    0:{
        //1 是命令号
        //账号登录的二进制协议打包 styoe = 0, cmd_type = 1,
        //data.uname 存放名字 data.upwd 存放密码
        1: function(data) { //encode_login_cmd
            //前面2个字节存放我们的服务号

            // 服务号（占2个字节） + 命令号（占2个字节） +  data.uname的长度（占2个字节）+  data.uname的内容 
            //+ data.upwd 的长度（占2个字节） + data.upwd的内容  
            var cmd_len = 2 + 2 + 2 + data.uname.length + 2 + data.upwd.length;
            var cmd_buf = Buffer.allocUnsafe(cmd_len);

            cmd_buf.writeUint16LE(0,0); //写入0 服务号
            cmd_buf.writeUint16LE(1,2); //写如 1 命令号

            // 数据部分
            //uname
            let len = data.uname.length;
            cmd_buf.writeUint16LE(len,4);
            cmd_buf.fill(data.uname, 4 + 2); // 4是前面  服务号 和 命令号各自占2个字节， 2 是data.uname 的长度信息
            
            //upwd
            len = data.upwd.length;
            var offset = 6 +data.uname.length;
            cmd_buf.writeUint16LE(len, offset);
            cmd_buf.fill(data.upwd, offset + 2);
            // end 

            return cmd_buf;
        }
    }
}

//二进制数据解码
var bin_decode = {
   //0 是服务号
   0:{
    //1 是命令号
        //账号登录的二进制协议解码,
        //cmd_buf 存放编码数据
        1: function(cmd_buf) { //decode_login_cmd
            var cmd = {
                0:0,
                1:1,
                2: null
            }
      
            // [2个字节服务号] [2个字节命令号] [2个字节 uname的长度] [uname的数据] [2个字节 upwd的长度] [upwd的数据] 
            var len = cmd_buf.readUint16LE(4); //uname的长度。 4 = 2（服务号） + 2(命令号)
            var offset = 4 + 2; //2 是uname 的长度信息
            
            var data = {};
            data.uname = cmd_buf.toString('utf8',offset, offset + len);

            offset += len;
            len = cmd_buf.readUint16LE(offset);
            offset += 2;
            data.upwd = cmd_buf.toString('utf8',offset, offset + len);

            cmd[2] = data;
            return cmd;
        }
    }
}

//将数据编码
function bin_encode_cmd(stype, cmd_type, data){
    if(bin_encode[stype] && bin_encode[stype][cmd_type]){
        return bin_encode[stype][cmd_type](data);
    }
    return null;
}

//将数据解码
function bin_decode_cmd(cmd_buf){
    var stype = cmd_buf.readUint16LE(0);
    var cmd_type =cmd_buf.readUint16LE(2);
    if(bin_decode[stype] && bin_decode[stype][cmd_type]){
        return bin_decode[stype][cmd_type](cmd_buf);
    }
    return null;
}

var bin_protocol = {
    encode: bin_encode_cmd,
    decode: bin_decode_cmd
}

module.exports = bin_protocol; 